/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package proxyserverapp;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.LocateRegistry;
import java.util.ArrayList;
import java.util.Random;

/*
 * Este é o servidor proxy que irá receber os nomes dos servicos dos servidores de calculadoras
 *
 */
public class ProxyServer extends UnicastRemoteObject implements IProxy {
        ArrayList<String> servers;

	public ProxyServer() throws RemoteException {
            super();
            // crio a lista de servidores - irei guardar a URL inteira do servico que eh prestado (IP e servico)
            // e buscar o objeto remoto a cada vez que eu precisar - é possivel guardar o proprio objeto remoto...
            servers = new ArrayList<String>();
	}

        public void connect (String connectionString) throws RemoteException {
            servers.add(connectionString);
        }

        public int add(int x, int y) throws RemoteException {
            int answer = -1;
            if (!servers.isEmpty()) {
                try {
                    // tenta achar um servidor na lista
                    Random r = new Random();
                    // pego um servidor aleatorio da lista de servidores disponiveis
                    // aqui, voces podem alterar a implementacao para pegar um servidor menos ocupado, por exemplo
                    int sv = r.nextInt(servers.size());
                    ICalculadora calc = (ICalculadora) Naming.lookup(servers.get(sv));
                    System.out.println("Running operation on server " + sv + " with connection string " + servers.get(sv));
                    answer = calc.add(x, y);

                } catch (Exception ex) {
                    System.out.println("Exception on proxyserver: " + ex);
                }
            } else {
                System.out.println("No calculator services available (start a CalcServer) ...");
            }
            return answer;
        }

	public static void main(String args[]) {

	    if ( System.getSecurityManager() == null )
	        System.setSecurityManager(new SecurityManager());

		try {
		    LocateRegistry.createRegistry (1099);

                    IProxy proxy = new ProxyServer();
		    Naming.rebind ("ProxyService1", proxy);
                    System.out.println("Proxy service is up on 'ProxyService1'...");
		} catch (Exception e) {
		    System.out.println(e);
		}
	}
}

